#include <stdio.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <luajit.h> // luajit才需要

void dump(lua_State *L) {
    int n = lua_gettop(L);
    for (int i = 1; i <= n; i++) {
        int type = lua_type(L, i);
        const char* str = lua_tostring(L, i);
        printf("%d: %s(%s)\n", i, str, lua_typename(L, type));
    }
}
int main() {
    lua_State *L = luaL_newstate();// 创建Lua状态机
    luaL_openlibs(L);// 打开Lua标准库

    if (luaL_loadfile(L, "test.lua") || lua_pcall(L, 0, 0, 0)) {// 加载并执行test.lua文件
        printf("Error: %s\n", lua_tostring(L, -1));// 如果出错，打印错误信息
        return 1;
    }

    lua_getglobal(L, "add");// 获取全局变量add
    lua_pushnumber(L, 10);// 压入第一个参数
    lua_pushnumber(L, 5);// 压入第二个参数
    lua_pcall(L, 2, 1, 0);// 调用add函数并传递两个参数，期望返回1个结果

    if (lua_isnumber(L, -1)) {// 如果返回值是一个数字
        double res = lua_tonumber(L, -1); // 获取返回值
        printf("res = %f\n", res); // 打印返回值
    }
    
    lua_getglobal(L, "sub");
    lua_pushnumber(L, 10);
    lua_pushnumber(L, 5);
    lua_pcall(L, 2, 1, 0);

    if (lua_isnumber(L, -1)) {
        double res = lua_tonumber(L, -1);
        printf("res = %f\n", res);
    }

    dump(L); 
    /* lua_tonumber() 不会弹出元素
    1: 15(number)
	2: 5(number)
	*/
    lua_close(L);// 销毁Lua状态机
    return 0;
}